import numpy as np
import scipy.fft
def simple_1d_dct_demo():
    """
    演示一维离散余弦变换 (DCT) 的能量压缩特性。
    我们使用一个简单的常数信号作为输入。
    """
    # 1. 创建输入信号：一个简单的常数信号（模拟平坦的图像区域）
    # 假设一个包含 8 个数据点的信号，每个点的值都是 255
    input_signal = np.array([255, 255, 255, 255, 255, 255, 255, 255], dtype=np.float32)
    print("--- 1D DCT 演示 ---")
    print(f"原始输入信号 (8个点): {input_signal}")

    # 2. 应用 1D DCT
    # numpy.fft 模块提供了 dct 函数
    # type=2 对应于通常在 JPEG 等应用中使用的 DCT-II
    dct_coeffs = scipy.fft.dct(input_signal, type=2, norm='ortho')
    print(f"\nDCT 系数: {dct_coeffs}")

    # 3. 观察能量压缩特性
    # 理论上，对于常数信号，只有第一个 (DC) 系数是非零的，其余都接近于零。
    print(f"\nDC 系数 (第一个系数): {dct_coeffs[0]:.4f}")
    print(f"AC 系数 (其余系数): {dct_coeffs[1:]}")

    # 4. 验证能量压缩：检查 AC 系数是否接近零
    if np.allclose(dct_coeffs[1:], 0, atol=1e-6): # 使用atol来处理浮点数精度问题
        print("\n观察到：大部分能量集中在第一个（DC）系数中，其余AC系数接近零。")
        print("这证明了DCT的能量压缩特性。")
    else:
        print("\n注意：AC系数并非完全为零，这可能是由于浮点数精度或信号非完全平坦。")

    # 5. 应用 1D 逆 DCT (IDCT) 以重建原始信号
    reconstructed_signal = scipy.fft.idct(dct_coeffs, type=2, norm='ortho')
    print(f"\n从DCT系数重建的信号: {reconstructed_signal}")

    # 6. 验证重建是否成功
    if np.allclose(input_signal, reconstructed_signal):
        print("\n验证：原始信号已成功从DCT系数重建，证明DCT是可逆的。")
    else:
        print("\n验证失败：原始信号未能成功重建。")

if __name__ == "__main__":
    simple_1d_dct_demo()